/**
 * 统一错误处理工具
 */
import {ElMessage} from 'element-plus'

/**
 * 处理错误并显示友好的提示信息
 * @param {Error} error - 错误对象
 * @param {string} context - 错误发生的上下文
 */
export function handleGlobalError(error, context = '') {
    console.error(`[Global Error] ${context}:`, error)
    
    // 检查是否是null或undefined错误
    if (!error) {
        console.warn(`[Global Error] Null error received in context: ${context}`, new Error().stack)
        return
    }

    ElMessage({
        message: '系统发生错误，请稍后再试',
        type: 'error',
        duration: 5000,
        showClose: true
    })
}

/**
 * 处理路由错误
 * @param {Error} error - 路由错误对象
 * @param {import('vue-router').RouteLocationNormalized} to - 目标路由
 */
export function handleRouterError(error, to) {
    console.error(`[Router Error] 导航到 "${to.path}" 时发生错误:`, error)
    
    // 检查是否是null或undefined错误
    if (!error) {
        console.warn(`[Router Error] Null error received when navigating to: ${to.path}`, new Error().stack)
        return
    }

    ElMessage({
        message: '页面加载失败，请刷新页面重试',
        type: 'error',
        duration: 5000,
        showClose: true
    })

    // 可以根据错误类型进行不同的处理
    if (error.name === 'ChunkLoadError') {
        // 处理懒加载模块加载失败的情况
        console.error('页面组件加载失败，可能需要重新加载页面')
        // 可以引导用户刷新页面或跳转到错误页面
    }
}

/**
 * 处理异步错误（Promise）
 * @param {Promise} promise - Promise 对象
 * @returns {Promise} 包装后的 Promise
 */
export function handlePromiseError(promise) {
    return promise.catch(error => {
        // 检查是否是null或undefined错误
        if (!error) {
            console.warn(`[Promise Error] Null error received`, new Error().stack)
            return
        }
        handleGlobalError(error, 'Promise rejection')
        throw error // 重新抛出错误
    })
}

/**
 * 初始化全局错误处理
 */
export function initGlobalErrorHandler() {
    // 全局未捕获的 Promise 错误
    window.addEventListener('unhandledrejection', event => {
        // 增强对event.reason的检查
        if (!event.reason) {
            console.warn('[Unhandled Rejection] Null reason received', event, new Error().stack)
        } else {
            handleGlobalError(event.reason, 'Unhandled Promise Rejection')
        }
        event.preventDefault() // 阻止默认的错误处理
    })

    // 全局 JavaScript 错误
    window.addEventListener('error', event => {
        // 增强对event.error的检查
        if (!event.error) {
            // 忽略 ResizeObserver 错误，这是浏览器的一个已知问题
            if (event.message && event.message.includes('ResizeObserver')) {
                // 阻止webpack-dev-server显示overlay错误提示
                event.stopImmediatePropagation();
                return;
            }
            
            console.warn(`[Window Error] Null error received. Event type: ${event.type}`, event, new Error().stack)
        } else {
            // 忽略 ResizeObserver 错误，这是浏览器的一个已知问题
            if (event.message && event.message.includes('ResizeObserver')) {
                // 阻止webpack-dev-server显示overlay错误提示
                event.stopImmediatePropagation();
                return;
            }
            
            handleGlobalError(event.error, 'Global JavaScript Error')
        }
    })
}